/*
    Kelompok    2
    Kelas       2
    Anggota :
    1. Yudha Wastu Prawira      / 13509002
    2. Robertus Theodore        / 13509008
    3. Rendy Bambang Junior     / 13509036
    4. Hartono Sulaiman Wijaya  / 13509046
    5. Daniel Prihartoni        / 13509088
    6. Raydhitya Yosep          / 13509092

*/


#ifndef _DISPLAY_H
#define _DISPLAY_H

#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <string>
#include <vector>
#include <map>
#include "Constant.h"
#include "Farm.h"
#include "Plant.h"
#include "Player.h"
#include "Dwarf.h"

using namespace std;

typedef struct {
	StateType state;
	Player player;
	Farm farm;
	Dwarf waterDwarf;
	Dwarf harvestDwarf;
	Dwarf slashDwarf;
	vector<string> message;
	string prompt;
	int mode;
} DisplayInfo;


typedef map<int,string> Information;

typedef vector< vector<string> > Terrain;
    // tipe data terrain, character yg akan tampilkan
typedef map<int,Terrain> DrawDictionary;
    // daftar beberapa terrain dengan kata kunci tertentu
typedef map<int, string> MapSymbols;
typedef vector<string> Message;

// Iterator
typedef Terrain::iterator TI; // Terrain Iterator
typedef DrawDictionary::iterator DI; // Dictionary Iterator
typedef MapSymbols::iterator MI; // Map Symbol Iterator
typedef vector<string>::iterator VI; // Vector Iterator
typedef Information::iterator II;

// Class Display
class Display{
	public :
        // Constructor
		Display();
            // akan memanggil  initializeSymbol() , initialize()
		// Copy Constructor
		Display(const Display&);

		// Destructor
		~Display();

		// Other Methods
        //
		void draw(DisplayInfo displayInfo);

        Message message;
        int mode;
		string prompt;
		StateType state;


	private :
        void initialize();
            //initialize dictionary pertama kali display dibuat
            //memanggil method mapping
        void mapping();
            // Metode ini akan memproyeksikan semua simbol sesuai objeknya
            // berdasarkan isi farmPlan
        void displayNow();
            // display akan mencetak ke layar terrain yang sesuai dengan kode area
                // HOME_CODE    = 1
                // FARM_CODE    = 2
                // STORE_CODE   = 3
                // akan memanggil drawHome()        jika kode == 1
                // akan memanggil drawFarmPlan()    jika kode == 2
                // akan memanggil drawStore()       jika kode == 3
            // atau display akan mencetak menu mode
		void update();
            // akan mengupdate semua properti display, termasuk
            // - meload kembali farmPlan
            // - memanggil  updateDsictionary
            // - memanggil displayNow(Area_code)
        void drawFarm();
		void drawHome();
		void drawStore();
        void drawMessage();
        void drawInformation(int);

        void drawPrompt();
		// Data Member
		DrawDictionary dictionary;
            // dictionary of terrains,
            // isi dictionary ini berasal dari method Mapping() pertama kali
        MapSymbols mapSymbols;
            // resource symbols untuk ditampilkan di layar
            // perlu diload ketika inisialisasi dan
            // symbol2 akan disimpan dalam dictionary

        MI mi;TI ti;VI vi;II ii;DI di;
            // semua iterator
        Information information;
        Farm farm;
		Player player;
		Dwarf dwarf1;
		Dwarf dwarf2;
		Dwarf dwarf3;


};
#endif
